package user;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;

public class AdminService {
    private List<User> userList = new ArrayList<>();
    private User currentLoginAdmin = null;
    private Scanner scanner = new Scanner(System.in);

    // 初始化默认数据（包含一个默认管理员）
    public AdminService() {
        userList.add(new User(10001, "admin", "admin123", "管理员",
                "13800001111", new Date(), false));
        // 添加测试用户
        userList.add(new Manager(20001, "manager01", "123456", "13900002222", new Date(), false));
        userList.add(new Reception(30001, "reception01", "123456", "13700003333", new Date(), false));
    }

    // 验证用户登录（供经理/前台使用）
    public User verifyUser(String username, String password, String userType) {
        for (User u : userList) {
            if (u.getUserType().equals(userType)
                    && u.getUserName().equals(username)
                    && u.getPassword().equals(password)) {
                return u;
            }
        }
        return null;
    }

    // 管理员登录
    public void login(String user, String pwd) {
        logout(); // 先退出当前登录

        for (User u : userList) {
            if ("管理员".equals(u.getUserType())
                    && u.getUserName().equals(user)
                    && u.getPassword().equals(pwd)) {
                currentLoginAdmin = u;
                System.out.println("管理员登录成功！");
                return;
            }
        }
        System.out.println("登录失败：用户名或密码错误，或非管理员账号");
    }

    // 显示管理员操作菜单
    public void showAdminMenu() {
        while (isLoggedIn()) {
            System.out.println("\n=== 管理员操作菜单 ===");
            System.out.println("1. 修改自身密码");
            System.out.println("2. 重置用户密码");
            System.out.println("3. 查看所有用户");
            System.out.println("4. 删除用户");
            System.out.println("5. 查询用户");
            System.out.println("6. 添加用户");
            System.out.println("7. 修改用户信息");
            System.out.println("8. 退出登录");
            System.out.print("请选择操作：");

            try {
                int choice = Integer.parseInt(scanner.nextLine().trim());
                switch (choice) {
                    case 1:
                        changeOwnPassword();
                        break;
                    case 2:
                        resetUserPassword();
                        break;
                    case 3:
                        listAllUsers();
                        break;
                    case 4:
                        deleteUser();
                        break;
                    case 5:
                        queryUser();
                        break;
                    case 6:
                        addUser();
                        break;
                    case 7:
                        updateUser();
                        break;
                    case 8:
                        logout();
                        break;
                    default:
                        System.out.println("无效选择（1-8）");
                }
            } catch (NumberFormatException e) {
                System.out.println("请输入数字（1-8）");
            }
        }
    }

    // 修改自身密码（需登录）
    public void changeOwnPassword() {
        if (!isLoggedIn()) {
            System.out.println("请先登录管理员账号！");
            return;
        }

        System.out.print("请输入旧密码：");
        String oldPwd = scanner.nextLine().trim();
        if (!oldPwd.equals(currentLoginAdmin.getPassword())) {
            System.out.println("旧密码输入错误！");
            return;
        }

        System.out.print("请输入新密码（至少6位）：");
        String newPwd = scanner.nextLine().trim();
        if (newPwd.length() < 6) {
            System.out.println("密码长度不能少于6位！");
            return;
        }

        System.out.print("请再次确认新密码：");
        String confirmPwd = scanner.nextLine().trim();

        if (newPwd.equals(confirmPwd)) {
            currentLoginAdmin.setPassword(newPwd);
            System.out.println("密码修改成功！");
        } else {
            System.out.println("两次输入的密码不一致，修改失败");
        }
    }

    // 重置非管理员密码（需登录）
    public void resetUserPassword() {
        if (!isLoggedIn()) {
            System.out.println("请先登录管理员账号！");
            return;
        }

        System.out.print("请输入需要重置密码的用户名：");
        String userName = scanner.nextLine().trim();

        for (User u : userList) {
            if (u.getUserName().equals(userName) && !"管理员".equals(u.getUserType())) {
                u.setPassword("123456"); // 默认重置密码
                u.setNeedChangePassword(true);
                System.out.println("密码已重置为123456，用户登录后需强制修改");
                return;
            }
        }
        System.out.println("未找到指定的非管理员用户");
    }

    // 列出所有用户（需登录）
    public void listAllUsers() {
        if (!isLoggedIn()) {
            System.out.println("请先登录管理员账号！");
            return;
        }

        System.out.println("\n=== 系统用户列表 ===");
        if (userList.isEmpty()) {
            System.out.println("暂无用户数据");
            return;
        }
        for (User u : userList) {
            System.out.printf("ID: %d, 用户名: %s, 类型: %s, 电话: %s%n",
                    u.getId(), u.getUserName(), u.getUserType(), u.getUserTelephone());
        }
    }

    // 删除用户（需登录）
    public void deleteUser() {
        if (!isLoggedIn()) {
            System.out.println("请先登录管理员账号！");
            return;
        }

        try {
            System.out.print("请输入要删除的用户ID：");
            int id = Integer.parseInt(scanner.nextLine().trim());

            Iterator<User> iterator = userList.iterator();
            while (iterator.hasNext()) {
                User u = iterator.next();
                if (u.getId() == id) {
                    if ("管理员".equals(u.getUserType())) {
                        System.out.println("不能删除管理员账号！");
                        return;
                    }
                    iterator.remove();
                    System.out.println("用户删除成功");
                    return;
                }
            }
            System.out.println("未找到指定ID的用户");
        } catch (NumberFormatException e) {
            System.out.println("ID必须是数字");
        }
    }

    // 查询用户（需登录）
    public void queryUser() {
        if (!isLoggedIn()) {
            System.out.println("请先登录管理员账号！");
            return;
        }

        System.out.print("请输入要查询的用户名：");
        String userName = scanner.nextLine().trim();

        for (User u : userList) {
            if (u.getUserName().equals(userName)) {
                System.out.println("\n查询到用户信息如下：");
                u.displayUserInfo();
                return;
            }
        }
        System.out.println("未找到指定用户");
    }

    // 添加用户（需登录）
    public void addUser() {
        if (!isLoggedIn()) {
            System.out.println("请先登录管理员账号！");
            return;
        }

        try {
            System.out.println("1.添加经理  2.添加前台");
            System.out.print("请选择用户类型：");
            int choice = Integer.parseInt(scanner.nextLine().trim());
            if (choice != 1 && choice != 2) {
                System.out.println("无效的用户类型选择（1或2）");
                return;
            }

            // 输入并校验ID唯一性
            System.out.print("请输入用户ID（数字）：");
            int id = Integer.parseInt(scanner.nextLine().trim());
            for (User u : userList) {
                if (u.getId() == id) {
                    System.out.println("该ID已被使用，请重新输入");
                    return;
                }
            }

            // 输入并校验用户名唯一性
            System.out.print("请输入用户名：");
            String userName = scanner.nextLine().trim();
            if (userName.isEmpty()) {
                System.out.println("用户名不能为空");
                return;
            }
            for (User u : userList) {
                if (u.getUserName().equals(userName)) {
                    System.out.println("该用户名已被使用，请重新输入");
                    return;
                }
            }

            // 密码校验
            System.out.print("请输入密码（至少6位）：");
            String password = scanner.nextLine().trim();
            if (password.length() < 6) {
                System.out.println("密码长度不能少于6位");
                return;
            }

            // 电话校验（简单校验长度）
            System.out.print("请输入电话（11位数字）：");
            String telephone = scanner.nextLine().trim();
            if (telephone.length() != 11 || !telephone.matches("\\d+")) {
                System.out.println("请输入11位数字的电话号码");
                return;
            }
            for (User u : userList) {
                if (u.getUserTelephone().equals(telephone)) {
                    System.out.println("该电话已被使用，请重新输入");
                    return;
                }
            }

            // 创建用户并添加到列表
            User newUser;
            Date registerTime = new Date();
            if (choice == 1) {
                newUser = new Manager(id, userName, password, telephone, registerTime, false);
            } else {
                newUser = new Reception(id, userName, password, telephone, registerTime, false);
            }
            userList.add(newUser);
            System.out.println("用户添加成功");
        } catch (NumberFormatException e) {
            System.out.println("输入的ID或类型选择不是有效数字");
        }
    }

    // 修改用户信息（需登录）
    public void updateUser() {
        if (!isLoggedIn()) {
            System.out.println("请先登录管理员账号！");
            return;
        }

        try {
            System.out.print("请输入要修改的用户ID：");
            int id = Integer.parseInt(scanner.nextLine().trim());

            User targetUser = null;
            for (User u : userList) {
                if (u.getId() == id) {
                    targetUser = u;
                    break;
                }
            }

            if (targetUser == null) {
                System.out.println("未找到指定用户");
                return;
            }

            if ("管理员".equals(targetUser.getUserType())) {
                System.out.println("不能修改管理员信息");
                return;
            }

            // 修改用户名
            System.out.print("请输入新用户名（不修改请回车）：");
            String newName = scanner.nextLine().trim();
            if (!newName.isEmpty()) {
                // 校验新用户名唯一性（排除当前用户）
                boolean nameExists = false;
                for (User u : userList) {
                    if (u.getUserName().equals(newName) && u.getId() != id) {
                        nameExists = true;
                        break;
                    }
                }
                if (nameExists) {
                    System.out.println("该用户名已被使用，修改失败");
                    return;
                }
                targetUser.setUserName(newName);
            }

            // 修改电话
            System.out.print("请输入新电话（11位数字，不修改请回车）：");
            String newTel = scanner.nextLine().trim();
            if (!newTel.isEmpty()) {
                if (newTel.length() != 11 || !newTel.matches("\\d+")) {
                    System.out.println("请输入11位数字的电话号码");
                    return;
                }
                // 校验新电话唯一性（排除当前用户）
                boolean telExists = false;
                for (User u : userList) {
                    if (u.getUserTelephone().equals(newTel) && u.getId() != id) {
                        telExists = true;
                        break;
                    }
                }
                if (telExists) {
                    System.out.println("该电话已被使用，修改失败");
                    return;
                }
                targetUser.setUserTelephone(newTel);
            }

            System.out.println("用户信息修改成功");
        } catch (NumberFormatException e) {
            System.out.println("ID必须是数字");
        }
    }

    // 退出登录
    public void logout() {
        currentLoginAdmin = null;
        System.out.println("已退出登录");
    }

    // 检查是否已登录
    public boolean isLoggedIn() {
        return currentLoginAdmin != null;
    }

    public List<User> getUserList() {
        return userList;
    }
}